#include "Date.h"

// void Date::Print(const Date* const this)
void Date::Print() const
{
	cout << _year << "年" << _month << "月" << _day << "日" << endl;
}

// 任何一个类，只需要写一个> == 或者 < ==重载 剩下比较运算符重载复用即可
bool Date::operator== (const Date& d) const
{
	return _year == d._year
		&& _month == d._month
		&& _day == d._day;
}

bool Date::operator>(const Date& d) const
{
	if ((_year > d._year)
		|| (_year == d._year && _month > d._month)
		|| (_year == d._year && _month == d._month && _day > d._day))
	{
		return true;
	}
	else
	{
		return false;
	}
}

bool Date::operator!=(const Date& d) const
{
	return !(*this == d);
}

bool Date::operator>=(const Date& d) const
{
	return (*this > d) || (*this == d);
}

bool Date::operator<(const Date& d) const
{
	return !(*this >= d);
}

bool Date::operator<=(const Date& d) const
{
	return !(*this > d);
}

// d1 + 100
Date Date::operator+(int day) const
{
	//Date ret(*this);
	Date ret = *this;
	ret += day;

	return ret;
}

// d2 += d1 += 100
Date& Date::operator+=(int day)
{
	if (day < 0)
	{
		return *this -= -day;
	}

	_day += day;
	while (_day > GetMonthDay(_year, _month))
	{
		_day -= GetMonthDay(_year, _month);
		++_month;
		if (_month == 13)
		{
			_year++;
			_month = 1;
		}
	}

	return *this;
}

//Date Date::operator+(int day)
//{
//	Date ret = *this;
//	// ...
//	ret._day += day;
//	while (ret._day > GetMonthDay(ret._year, ret._month))
//	{
//		//...
//	}
//
//	return ret;
//}
//
//// d1 += 100
//Date& Date::operator+=(int day)
//{
//	*this = *this + day;
//
//	return *this;
//}

Date& Date::operator++() // 前置
{
	//*this += 1;
	//return *this;

	return *this += 1;
}

Date Date::operator++(int) // 后置
{
	Date tmp(*this);
	*this += 1;

	return tmp;
}

Date Date::operator-(int day) const
{
	Date ret = *this;
	ret -= day;
	return ret;
}

Date& Date::operator-=(int day)
{
	if (day < 0)
	{
		return *this += -day;
	}

	_day -= day;
	while (_day <= 0)
	{
		--_month;
		if (_month == 0)
		{
			--_year;
			_month = 12;
		}

		_day += GetMonthDay(_year, _month);
	}

	return *this;
}

Date& Date::operator--() // 前置
{
	return *this -= 1;
}

Date Date::operator--(int) // 后置
{
	Date tmp(*this);
	*this -= 1;
	return tmp;
}

// d1 - d2
int Date::operator-(const Date& d) const
{
	int flag = 1;
	Date max = *this;
	Date min = d;
	if (*this < d)
	{
		max = d;
		min = *this;
		flag = -1;
	}

	int n = 0;
	while (min != max)
	{
		++min;
		++n;
	}

	return n * flag;
}

//void Date::operator<<(ostream& out)
//{
//	out << _year << "-" << _month << "-" << _day << endl;
//}


//#include "Date.h"
//
///* 获取月对应的天数 */
//int Date::GetMonthDay(int year, int month) const 
//{
//	static int monthDatArr[13] = { 0,31, 28, 31, 30, 31, 30,31, 31, 30, 31, 30, 31 };// 简陋哈希
//	int day = monthDatArr[month];	            // 获取天数
//
//	if (month == 2                              // 先判断是否为二月
//		&& ((year % 4 == 0 && year % 100 != 0)  // 是二月，再判断是否是闰年
//			|| (year % 400 == 0))) 
//	{
//		day += 1;                               // 是闰年，天数+1
//	}
//
//	return day;
//}
//
///* 全缺省构造函数 */
//Date::Date(int year, int month, int day) 
//{
//	this->_year = year;
//	this->_month = month;
//	this->_day = day;
//
//	// 判断日期是否合法
//	if (!(_year >= 0
//		&& (month > 0 && month < 13)
//		&& (day > 0 && _day <= GetMonthDay(year, month)))) 
//	{
//		cout << "非法日期: ";
//		this->Print();  // 访问成员函数（this可省略）
//	}
//}
//
///* 打印函数 */
//void Date::Print() const 
//{
//	printf("%d-%d-%d\n", this->_year, this->_month, this->_day);
//}
//
///* d1 > d2 */
//bool Date::operator>(const Date& d) const 
//{
//	if (this->_year > d._year) 
//	{
//		return true;
//	}
//	else if (this->_year == d._year
//		&& this->_month > d._month) 
//	{
//		return true;
//	}
//	else if (this->_year == d._year
//		&& this->_month == d._month
//		&& this->_day > d._day) 
//	{
//		return true;
//	}
//	else
//	{
//		return false;
//	}
//}
//
///* d1 == d2 */
//bool Date::operator==(const Date& d) const
//{
//	return this->_year == d._year
//		&& this->_month == d._month
//		&& this->_day == d._day;
//}
//
///* d1 >= d2 */
//bool Date::operator>=(const Date& d) const 
//{
//	return *this > d || *this == d;
//}
//
///* d1 < d2 */
//bool Date::operator<(const Date& d) const 
//{
//	return !(*this >= d);
//}
//
///* d1 <= d2 */
//bool Date::operator<=(const Date& d) const 
//{
//	return !(*this > d);
//}
//
///* d1 != d2*/
//bool Date::operator!=(const Date& d) const 
//{
//	return !(*this == d);
//}
//
//
///* d1 += 100 */
//Date& Date::operator+=(int day)
//{
//	if (day < 0)
//	{
//		return *this -= day;
//	}
//
//	this->_day += day;  // 把要加的天数倒进d1里
//	while (this->_day > GetMonthDay(this->_year, this->_month))  // 判断天数是否需要进位
//	{
//		this->_day -= GetMonthDay(this->_year, this->_month);   // 减去当前月的天数
//		this->_month++;  // 月份+1
//
//		if (this->_month == 13)   // 判断月份是否需要进位
//		{
//			this->_month = 1;  // 重置月份
//			this->_year++;   // 年份+1
//		}
//	}
//
//	return *this;
//}
//
///* d1 -= 100 */
//Date& Date::operator-=(int day) 
//{
//	if (day < 0) 
//	{
//		return *this += -day;
//	}
//
//	this->_day -= day;
//	while (this->_day <= 0)
//	{   // 天数为0或小于0了，就得借位，直到>0为止。
//		this->_month--;  // 向月借
//		if (this->_month == 0) 
//		{   // 判断月是否有得借
//			this->_year--;   // 月没得借了，向年借
//			this->_month = 12;  // 年-1了，月份置为12月
//		}
//
//		this->_day += GetMonthDay(this->_year, this->_month);  // 把借来的天数加到_day上
//	}
//
//	return *this;
//}
//
///* d1 + 100 */
//Date Date::operator+(int day) const 
//{
//	Date ret(*this);  // 拷贝构造一个d1
//	ret += day;       // ret.operator+=(day);
//
//	return ret;   // 出了作用域ret对象就不在了，所以不能用引用返回
//}
//
///* d1 - 100 */
//Date Date::operator-(int day) const 
//{
//	Date ret(*this);   // 拷贝构造一个d1
//	ret -= day;        // ret.operator-=(day);
//
//	return ret;
//}
//
///* ++d1 */
//Date& Date::operator++()
//{
//	*this += 1;
//	return *this;
//}
//
///* d1++ */
//Date Date::operator++(int)
//{
//	Date ret(*this);   // 拷贝构造一个d1
//	*this += 1;
//
//	return ret;
//}
//
///* --d1 */
//Date& Date::operator--()
//{
//	*this -= 1;
//	return *this;
//}
//
///* d1-- */
//Date Date::operator--(int)
//{
//	Date ret(*this);   // 拷贝构造一个d1
//	*this += 1;
//
//	return ret;
//}
//
///* 日期减日期 */
//int Date::operator-(const Date& d) const
//{
//	// 默认认为第一个大，第二个小
//	Date max = *this;
//	Date min = d;
//	int flag = 1;      // 立个flag
//
//	// 如果第一个小，第二个大
//	if (*this < d)
//	{
//		max = d;
//		min = *this;
//		flag = -1;     // 说明我们立的flag立错了，改成-1
//	}
//
//	int count = 0;
//	while (min != max)
//	{
//		min++;
//		count++;
//	}
//
//	return count * flag;
//}
//
///* 返回星期几 */
//void Date::PrintWeekDay() const 
//{
//	// 1900.1.1 日（星期一）开始算
//	const char* week[] = { "周一", "周二", "周三", "周四", "周五", "周六", "周日" };
//
//	int count = *this - Date(1900, 1, 1);  // 可以使用匿名对象
//	cout << week[count % 7] << endl;
//}

#include "Date.h"

// void Date::Print(const Date* const this)
void Date::Print() const
{
	cout << _year << "年" << _month << "月" << _day << "日" << endl;
}